package com.jf.cloud.service.sysmanager.common.util;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

/**
 * JSON工具类
 * 
 * @author 程伟平 创建时间：2012-02-22 11:05:06
 */
public final class JsonUtil {

	private static final Log log = LogFactory.getLog(JsonUtil.class);

	/**
	 * JSON工厂
	 */
	private static final JsonFactory jsonFactory = getJsonFactory();

	/**
	 * 获取JSON工厂
	 * 
	 * @author 程伟平 创建时间：2012-02-22 16:53:46
	 * @return JSON工厂
	 */
	private static JsonFactory getJsonFactory() {
		ObjectMapper objectMapper = new ObjectMapper();
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		objectMapper.getSerializationConfig().setDateFormat(dateFormat);
		objectMapper.getDeserializationConfig().setDateFormat(dateFormat);
		return new MappingJsonFactory(objectMapper);
	}

	/**
	 * 将JSON字符串转换成Java对象
	 * <p>
	 * 注意：如果返回类型T为容器类型（Collection、Map）不建议用此方法，请用toPOJO(String json, TypeReference&lt;?&gt; valueTypeRef)替代。
	 * 
	 * @author 程伟平 创建时间：2012-02-22 11:05:06
	 * @param json JSON字符串
	 * @param valueType Java类型
	 * @return Java对象
	 * @throws IOException
	 */
	public static <T> T toPOJO(String json, Class<T> valueType) throws IOException {
		JsonParser jsonParser = jsonFactory.createJsonParser(json);
		T o = jsonParser.readValueAs(valueType);
		jsonParser.close();
		return o;
	}

	/**
	 * 将JSON字符串转换成Java对象
	 * <p>
	 * 注意：如果返回类型T为容器类型（Collection、Map）建议用此方法，否则toPOJO(String json, Class&lt;T&gt; valueType)方法更方便。
	 * <p>
	 * 示例：List&lt;Map&lt;String, Object&gt;&gt; list = toPOJO(JSON字符串, new TypeReference&lt;List&lt;Map&lt;String, Object&gt;&gt;&gt;() {});。
	 * 
	 * @author 程伟平 创建时间：2012-02-22 11:05:06
	 * @param json JSON字符串
	 * @param valueTypeRef Java类型
	 * @return Java对象
	 * @throws IOException
	 */
	public static <T> T toPOJO(String json, TypeReference<?> valueTypeRef) throws IOException {
		JsonParser jsonParser = jsonFactory.createJsonParser(json);
		T o = (T) jsonParser.readValueAs(valueTypeRef);
		jsonParser.close();
		return o;
	}

	/**
	 * 将Java对象转换成JSON字符串
	 * 
	 * @author 程伟平 创建时间：2012-02-22 10:59:19
	 * @param o Java对象
	 * @return JSON字符串
	 * @throws IOException
	 */
	public static String toJSON(Object o){
		try {
			Writer writer = new StringWriter();
			JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(writer);
			jsonGenerator.writeObject(o);
			jsonGenerator.close();
			return writer.toString();
		} catch (Exception e) {
			return "{desc:\"将Java对象转换成JSON字符串出错！\"}";
		}
	}
}